#include <stdio.h>
#include <gmp.h>

int main() {
    // 声明大整数类型
    mpz_t a, b, result, div_result, rem_result, exp_result;

    // 初始化所有 mpz_t 变量
    mpz_init(a);
    mpz_init(b);
    mpz_init(result);
    mpz_init(div_result);
    mpz_init(rem_result);
    mpz_init(exp_result);

    // 为 a 和 b 设置值
    mpz_set_str(a, "123456789012345678901234567890", 10);
    mpz_set_str(b, "987654321098765432109876543210", 10);
    
    // 打印 a 和 b 的值
    gmp_printf("a 的值: %Zd\n", a);
    gmp_printf("b 的值: %Zd\n", b);

    // 加法
    mpz_add(result, a, b);
    gmp_printf("加法结果: %Zd\n", result);

    // 减法
    mpz_sub(result, b, a);
    gmp_printf("减法结果: %Zd\n", result);

    // 乘法
    mpz_mul(result, a, b);
    gmp_printf("乘法结果: %Zd\n", result);

    // 除法
    mpz_tdiv_qr(div_result, rem_result, b, a); // div_result = b / a ， rem_result = b % a
    gmp_printf("除法结果: %Zd\n", div_result);
    gmp_printf("余数: %Zd\n", rem_result);

    // 乘方（指数运算）
    mpz_pow_ui(exp_result, a, 2); // exp_result = a^2
    gmp_printf("乘方结果: %Zd\n", exp_result);

    // 清理内存
    mpz_clear(a);
    mpz_clear(b);
    mpz_clear(result);
    mpz_clear(div_result);
    mpz_clear(rem_result);
    mpz_clear(exp_result);

    return 0;
}
